å€åããJITã³ã³ãã€ã«ãŸã§ãé«åºŠãªåæé©åæè¡ãæãäžããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ãœãããŠã§ã¢ããã©ãŒãã³ã¹ãšå¹çãå€§å¹ ã«åäžãããŸããé床ãæå€§åãããªãœãŒã¹æ¶è²»ãåæžããŸãã
é«åºŠãªåæé©åïŒã°ããŒãã«ã¢ãŒããã¯ãã£ã«ãããæé«ããã©ãŒãã³ã¹ã®è§£æŸ
åºå€§ã§çµ¶ããé²åãããœãããŠã§ã¢éçºã®äžçã«ãããŠãããã©ãŒãã³ã¹ã¯äŸç¶ãšããŠæéèŠèª²é¡ã§ããé«é »åºŠååŒã·ã¹ãã ããã¹ã±ãŒã©ãã«ãªã¯ã©ãŠããµãŒãã¹ããªãœãŒã¹ã«å¶çŽã®ãããšããžããã€ã¹ãŸã§ãæ©èœçã§ããã ãã§ãªããéåžžã«é«éã§å¹ççãªã¢ããªã±ãŒã·ã§ã³ãžã®éèŠã¯äžççã«é«ãŸãç¶ããŠããŸããã¢ã«ãŽãªãºã ã®æ¹åãã¢ãŒããã¯ãã£ã®æ±ºå®ã泚ç®ãéããã¡ã§ãããããæ·±ãããã詳现ãªã¬ãã«ã®æé©åãç§ãã¡ã®ã³ãŒãã®ãŸãã«æ§é ã®äžã«ååšããŸãããããé«åºŠãªåæé©åã§ãããã®ããã°èšäºã§ã¯ãåã·ã¹ãã ãæ£ç¢ºã«çè§£ããããšã§ãå€§å¹ ãªããã©ãŒãã³ã¹åäžãå®çŸãããªãœãŒã¹æ¶è²»ãåæžããããå ç¢ã§ã°ããŒãã«ã«ç«¶äºåã®ãããœãããŠã§ã¢ãæ§ç¯ããããã®æŽç·Žãããæè¡ãæãäžããŸãã
äžçäžã®éçºè ã«ãšã£ãŠããããã®é«åºŠãªæŠç¥ãçè§£ãé©çšããããšã¯ãåã«æ©èœããã¢ããªã±ãŒã·ã§ã³ãšãåªãããŠãŒã¶ãŒäœéšãšå€æ§ãªããŒããŠã§ã¢ããã³ãœãããŠã§ã¢ãšã³ã·ã¹ãã å šäœã§ã®éçšã³ã¹ãåæžãå®çŸãããåè¶ããã¢ããªã±ãŒã·ã§ã³ãšã®éããæå³ããŸãã
åã·ã¹ãã ã®åºç€ãçè§£ããïŒã°ããŒãã«ãªèŠç¹
é«åºŠãªæè¡ã«é£ã³èŸŒãåã«ãåã·ã¹ãã ãšãã®åºæã®ããã©ãŒãã³ã¹ç¹æ§ã«ã€ããŠã®çè§£ãåºããããšãéèŠã§ããããŸããŸãªå°åãæ¥çã§äººæ°ã®ããç°ãªãèšèªã¯ããããããã¬ãŒããªãã®ãããã¿ã€ãã³ã°ã«å¯Ÿããç¬èªã®ã¢ãããŒããæäŸããŠããŸãã
éçåä»ã vs. åçåä»ãã®åèïŒããã©ãŒãã³ã¹ãžã®åœ±é¿
éçåä»ããšåçåä»ãã®äºåæ³ã¯ãããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããŸããéçåä»ãèšèªïŒäŸïŒC++ãJavaãC#ãRustãGoïŒã¯ãã³ã³ãã€ã«æã«åãã§ãã¯ãå®è¡ããŸãããã®æ©æã®æ€èšŒã«ãããã³ã³ãã€ã©ã¯é«åºŠã«æé©åããããã·ã³ã³ãŒããçæã§ããåçåä»ãç°å¢ã§ã¯äžå¯èœãªããŒã¿åœ¢ç¶ãæäœã«é¢ããä»®å®ãç«ãŠãããšããããããŸããå®è¡æã®åãã§ãã¯ã®ãªãŒããŒãããã¯æé€ãããã¡ã¢ãªã¬ã€ã¢ãŠãã¯ããäºæž¬å¯èœã«ãªãããã£ãã·ã¥ã®å©çšçãåäžããŸãã
éã«ãåçåä»ãèšèªïŒäŸïŒPythonãJavaScriptãRubyïŒã¯ãåãã§ãã¯ãå®è¡æã«å»¶æããŸããããã«ãããæè»æ§ãåäžããåæéçºãµã€ã¯ã«ãéããªãäžæ¹ã§ãããã©ãŒãã³ã¹äžã®ã³ã¹ãã䌎ãããšããããããŸããå®è¡æã®åæšè«ããã¯ã·ã³ã°/ã¢ã³ãã¯ã·ã³ã°ãããªã¢ãŒãã£ãã¯ãªãã£ã¹ãããã¯ãç¹ã«ããã©ãŒãã³ã¹ãéèŠãªã»ã¯ã·ã§ã³ã§å®è¡é床ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ã®ãããªãŒããŒãããããããããŸããçŸä»£ã®JITã³ã³ãã€ã©ã¯ãããã®ã³ã¹ãã®äžéšã軜æžããŸãããæ ¹æ¬çãªéãã¯æ®ããŸãã
æœè±¡åãšããªã¢ãŒãã£ãºã ã®ã³ã¹ã
æœè±¡åã¯ãä¿å®å¯èœã§ã¹ã±ãŒã©ãã«ãªãœãããŠã§ã¢ã®åºç€ã§ãããªããžã§ã¯ãæåããã°ã©ãã³ã°ïŒOOPïŒã¯ãå ±éã®ã€ã³ã¿ãŒãã§ãŒã¹ãŸãã¯åºåºã¯ã©ã¹ãä»ããŠç°ãªãåã®ãªããžã§ã¯ããçµ±äžçã«æ±ãããšãå¯èœã«ããããªã¢ãŒãã£ãºã ã«å€§ããäŸåããŠããŸãããããããã®åã«ã¯ãã°ãã°ããã©ãŒãã³ã¹ã®ããã«ãã£ã䌎ããŸããä»®æ³é¢æ°åŒã³åºãïŒvtableã«ãã¯ã¢ããïŒãã€ã³ã¿ãŒãã§ãŒã¹ãã£ã¹ããããåçã¡ãœãã解決ã¯ã鿥çãªã¡ã¢ãªã¢ã¯ã»ã¹ãåŒãèµ·ãããã³ã³ãã€ã©ã«ããç©æ¥µçãªã€ã³ã©ã€ã³åã劚ããŸãã
äžççã«ãC++ãJavaããŸãã¯C#ã䜿çšããéçºè ã¯ããã°ãã°ãã®ãã¬ãŒããªãã«èŠæ ®ããŸãããã¶ã€ã³ãã¿ãŒã³ãæ¡åŒµæ§ã«ã¯äžå¯æ¬ ã§ãããããããªã³ãŒããã¹ã§ã®å®è¡æããªã¢ãŒãã£ãºã ã®é床ã®äœ¿çšã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ã€ãªããå¯èœæ§ããããŸããé«åºŠãªåæé©åã«ã¯ããããã®ã³ã¹ããåæžãŸãã¯æé©åããæŠç¥ãå«ãŸããããšããããããŸãã
é«åºŠãªåæé©åã®ã³ã¢æè¡
ããã§ã¯ãããã©ãŒãã³ã¹åäžã®ããã«åã·ã¹ãã ãæŽ»çšããå ·äœçãªæè¡ãæ¢ã£ãŠã¿ãŸãããã
å€åãšæ§é äœã®æŽ»çš
æã圱é¿åã®ããåæé©åã®1ã€ã¯ãåç §åïŒã¯ã©ã¹ïŒã®ä»£ããã«å€åïŒæ§é äœïŒãè³¢æã«äœ¿çšããããšã§ãããªããžã§ã¯ããåç §åã®å Žåããã®ããŒã¿ã¯éåžžããŒãã«å²ãåœãŠããã倿°ã¯ãã®ã¡ã¢ãªãžã®åç §ïŒãã€ã³ã¿ïŒãä¿æããŸããããããå€åã¯ã宣èšãããå Žæã«çŽæ¥ããŒã¿ãæ ŒçŽããå€ãã®å Žåã¹ã¿ãã¯äžããŸãã¯ä»ã®ãªããžã§ã¯ãå ã«ã€ã³ã©ã€ã³ã§æ ŒçŽãããŸãã
- ããŒãå²ãåœãŠã®åæžïŒ ããŒãå²ãåœãŠã¯é«ã³ã¹ãã§ãã空ãã¡ã¢ãªãããã¯ã®æ€çŽ¢ãå
éšããŒã¿æ§é ã®æŽæ°ããããŠæœåšçã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ããªã¬ãŒã䌎ããŸããå€åã¯ãç¹ã«ã³ã¬ã¯ã·ã§ã³å
ãããŒã«ã«å€æ°ãšããŠäœ¿çšãããå ŽåãããŒããžã®å§åã倧å¹
ã«åæžããŸããããã¯ãC#ïŒ
structã䜿çšïŒãJavaïŒJavaã®ããªããã£ãã¯æ¬è³ªçã«å€åã§ãããProject Valhallaã¯ããäžè¬çãªå€åãå°å ¥ããããšãç®æããŠããŸãïŒã®ãããªã¬ããŒãžã³ã¬ã¯ã·ã§ã³èšèªã§ç¹ã«æçã§ãã - ãã£ãã·ã¥å±ææ§ã®åäžïŒ å€åã®é åãã³ã¬ã¯ã·ã§ã³ãã¡ã¢ãªäžã§é£ç¶ããŠæ ŒçŽããããšãèŠçŽ ã«é 次ã¢ã¯ã»ã¹ããããšã§åªãããã£ãã·ã¥å±ææ§ãåŸãããŸããCPUã¯ããŒã¿ããã广çã«ããªãã§ããã§ããããŒã¿åŠçãé«éã«ãªããŸããããã¯ãç§åŠã·ãã¥ã¬ãŒã·ã§ã³ããã²ãŒã éçºãŸã§ããã¹ãŠã®ããŒããŠã§ã¢ã¢ãŒããã¯ãã£ã«ãããããã©ãŒãã³ã¹éèŠã®ã¢ããªã±ãŒã·ã§ã³ã«ãããŠéèŠãªèŠçŽ ã§ãã
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãªãŒããŒããããªãïŒ èªåã¡ã¢ãªç®¡çãæã€èšèªã§ã¯ãå€åã¯ã¹ã³ãŒããå€ãããšèªåçã«è§£æŸããããïŒã¹ã¿ãã¯å²ãåœãŠïŒããŸãã¯ãããå«ããªããžã§ã¯ããåéããããšãã«è§£æŸãããïŒã€ã³ã©ã€ã³ã¹ãã¬ãŒãžïŒãããã¬ããŒãžã³ã¬ã¯ã¿ã®äœæ¥è² è·ãå€§å¹ ã«åæžã§ããŸãã
ã°ããŒãã«ãªäŸïŒ C#ã§ã¯ãæ°åŠæŒç®çšã®Vector3æ§é äœããã°ã©ãã£ãã¯åº§æšçšã®Pointæ§é äœã¯ãã¹ã¿ãã¯å²ãåœãŠãšãã£ãã·ã¥ã®å©ç¹ã«ãããããã©ãŒãã³ã¹ãéèŠãªã«ãŒãã§ã¯ã©ã¹çãäžåããŸããåæ§ã«ãRustã§ã¯ããã¹ãŠã®åã¯ããã©ã«ãã§å€åã§ãããéçºè
ã¯ããŒãå²ãåœãŠãå¿
èŠãªå Žåã«æç€ºçã«åç
§åïŒBoxãArcãRcïŒã䜿çšãããããå€ã»ãã³ãã£ã¯ã¹ã«é¢ããããã©ãŒãã³ã¹ã®èæ
®ã¯èšèªèšèšã«åºæã®ãã®ã§ãã
ãžã§ããªã¯ã¹ãšãã³ãã¬ãŒãã®æé©å
ãžã§ããªã¯ã¹ïŒJavaãC#ãGoïŒãšãã³ãã¬ãŒãïŒC++ïŒã¯ãåå®å šæ§ãç ç²ã«ããããšãªãåã«äŸåããªãã³ãŒããæžãããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸãããããããã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯ãèšèªã®å®è£ ã«ãã£ãŠç°ãªãå ŽåããããŸãã
- åçžå vs. ããªã¢ãŒãã£ãºã ïŒ C++ã®ãã³ãã¬ãŒãã¯éåžžãåçžåïŒmonomorphizedïŒãããŸããã³ã³ãã€ã©ã¯ããã³ãã¬ãŒãã§äœ¿çšãããåç°ãªãåã«å¯ŸããŠãåå¥ã®ç¹æ®åãããããŒãžã§ã³ã®ã³ãŒããçæããŸããããã«ãããé«åºŠã«æé©åãããçŽæ¥åŒã³åºããå¯èœã«ãªããå®è¡æãã£ã¹ãããã®ãªãŒããŒããããæé€ãããŸããRustã®ãžã§ããªã¯ã¹ãäž»ã«åçžåã䜿çšããŸãã
- å
±æã³ãŒããžã§ããªã¯ã¹ïŒ JavaãC#ã®ãããªèšèªã¯ãåäžã®ã³ã³ãã€ã«æžã¿ãžã§ããªãã¯å®è£
ããã¹ãŠã®åç
§åãåŠçãããå
±æã³ãŒããã¢ãããŒãããã°ãã°äœ¿çšããŸãïŒJavaã§ã¯åæ¶å»åŸãC#ã§ã¯ç¹å®ã®å¶çŽã®ãªãå€åã«å¯ŸããŠå
éšçã«
objectã䜿çšïŒãããã«ããã³ãŒããµã€ãºã¯åæžãããŸãããå€åã®ãã¯ã·ã³ã°/ã¢ã³ãã¯ã·ã³ã°ãå®è¡æã®åãã§ãã¯ã®ããã®ããããªãªãŒããŒããããçºçããå¯èœæ§ããããŸããããããC#ã®structãžã§ããªã¯ã¹ã¯ããã°ãã°ç¹æ®åãããã³ãŒãçæã®æ©æµãåããŸãã - ç¹æ®åãšå¶çŽïŒ ãžã§ããªã¯ã¹ã§åå¶çŽã掻çšããïŒäŸïŒC#ã®
where T : structïŒããC++ã§ãã³ãã¬ãŒãã¡ã¿ããã°ã©ãã³ã°ã䜿çšããããšã§ãã³ã³ãã€ã©ã¯ãžã§ããªãã¯åã«ã€ããŠãã匷åãªä»®å®ãç«ãŠãããšãã§ããããå¹ççãªã³ãŒããçæã§ããŸããäžè¬çãªåã«å¯Ÿããæç€ºçãªç¹æ®åã¯ãããã©ãŒãã³ã¹ãããã«æé©åã§ããŸãã
å®è·µçãªæŽå¯ïŒ éžæããèšèªããžã§ããªã¯ã¹ãã©ã®ããã«å®è£ ããŠããããçè§£ããŠãã ãããããã©ãŒãã³ã¹ãéèŠãªå Žåã¯åçžåããããžã§ããªã¯ã¹ãåªå ããå ±æã³ãŒãã®ãžã§ããªãã¯å®è£ ã«ããããã¯ã·ã³ã°ã®ãªãŒããŒãããã«æ³šæããŠãã ãããç¹ã«å€åã®ã³ã¬ã¯ã·ã§ã³ãæ±ãå Žåã¯æ³šæãå¿ èŠã§ãã
äžå€åã®å¹æçãªäœ¿çš
äžå€åã¯ãäœæåŸã«ãã®ç¶æ ã倿Žã§ããªããªããžã§ã¯ãã§ããäžèŠãããšã倿Žã«ã¯æ°ãããªããžã§ã¯ãã®äœæãå¿ èŠãªãããããã©ãŒãã³ã¹ã«åããããã«æãããããããŸããããäžå€æ§ã¯ãã°ããŒãã«åãããã³ã³ãã¥ãŒãã£ã³ã°ç°å¢ã§ãŸããŸãäžè¬çã«ãªã£ãŠãã䞊è¡ã·ã¹ãã ã忣ã·ã¹ãã ã«ãããŠãç¹ã«å€§ããªããã©ãŒãã³ã¹äžã®å©ç¹ãæäŸããŸãã
- ããã¯ãªãã®Tã¹ã¬ããã»ãŒããã£ïŒ äžå€ãªããžã§ã¯ãã¯æ¬è³ªçã«ã¹ã¬ããã»ãŒãã§ããè€æ°ã®ã¹ã¬ããããæªåé«ãããã©ãŒãã³ã¹ã®ããã«ããã¯ã§ããããã«ãã¹ã¬ããããã°ã©ãã³ã°ã®è€éãã®åå ã§ããããã¯ãåæããªããã£ããå¿ èŠãšããã«ãäžå€ãªããžã§ã¯ããåæã«èªã¿åãããšãã§ããŸããããã«ããã䞊è¡ããã°ã©ãã³ã°ã¢ãã«ãç°¡çŽ åããããã«ãã³ã¢ããã»ããµã§ã®ã¹ã±ãŒãªã³ã°ã容æã«ãªããŸãã
- å®å šãªå ±æãšãã£ãã·ã³ã°ïŒ äžå€ãªããžã§ã¯ãã¯ãäºæãã¬å¯äœçšãæããããšãªããã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãéšåããããã¯ãŒã¯å¢çãè¶ããŠïŒã·ãªã¢ã©ã€ãºåã䌎ãïŒå®å šã«å ±æã§ããŸãããã®ç¶æ ã¯æ±ºããŠå€ãããªãããããã£ãã·ã³ã°ã®åªããåè£ã§ãã
- äºæž¬å¯èœæ§ãšãããã°ïŒ äžå€ãªããžã§ã¯ãã®äºæž¬å¯èœãªæ§è³ªã¯ãå ±æãããå¯å€ç¶æ ã«é¢é£ãããã°ãæžãããããå ç¢ãªã·ã¹ãã ã«ã€ãªãããŸãã
- 颿°åããã°ã©ãã³ã°ã«ãããããã©ãŒãã³ã¹ïŒ 匷åãªé¢æ°åããã°ã©ãã³ã°ãã©ãã€ã ãæã€èšèªïŒäŸïŒHaskellãF#ãScalaãã©ã€ãã©ãªã䜿çšããJavaScriptãPythonãªã©ïŒã¯ãäžå€æ§ãå€çšããŸããã倿Žãã®ããã«æ°ãããªããžã§ã¯ããäœæããããšã¯ã³ã¹ãããããããã«èŠãããããããŸããããã³ã³ãã€ã©ãã©ã³ã¿ã€ã ã¯ãã°ãã°ãããã®æäœãæé©åãïŒäŸïŒæ°žç¶ããŒã¿æ§é ã«ãããæ§é å ±æïŒããªãŒããŒããããæå°éã«æããŸãã
ã°ããŒãã«ãªäŸïŒ èšå®ãéèååŒããŸãã¯ãŠãŒã¶ãŒãããã¡ã€ã«ãäžå€ãªããžã§ã¯ããšããŠè¡šçŸããããšã§ãã°ããŒãã«ã«åæ£ãããã€ã¯ããµãŒãã¹å
šäœã§äžè²«æ§ã確ä¿ãã䞊è¡åŠçãç°¡çŽ åããŸããJavaã®ãããªèšèªã¯ãäžå€æ§ãä¿é²ããããã«finalãã£ãŒã«ããã¡ãœãããæäŸããGuavaã®ãããªã©ã€ãã©ãªã¯äžå€ã³ã¬ã¯ã·ã§ã³ãæäŸããŸããJavaScriptã§ã¯ãObject.freeze()ãImmerãImmutable.jsã®ãããªã©ã€ãã©ãªãäžå€ããŒã¿æ§é ã容æã«ããŸãã
åæ¶å»ãšã€ã³ã¿ãŒãã§ãŒã¹ãã£ã¹ãããã®æé©å
Javaã®ãžã§ããªã¯ã¹ã«ãã°ãã°é¢é£ä»ããããåæ¶å»ããŸãã¯ããåºããããªã¢ãŒãã£ãã¯ãªåäœãå®çŸããããã®ã€ã³ã¿ãŒãã§ãŒã¹/ãã¬ã€ãã®äœ¿çšã¯ãåçãã£ã¹ãããã«ããããã©ãŒãã³ã¹ã³ã¹ããçºçãããå¯èœæ§ããããŸããã€ã³ã¿ãŒãã§ãŒã¹åç §ã§ã¡ãœãããåŒã³åºããããšãã©ã³ã¿ã€ã ã¯ãªããžã§ã¯ãã®å®éã®å ·è±¡åãæ±ºå®ããæ£ããã¡ãœããå®è£ ãåŒã³åºãå¿ èŠããããŸããããã¯vtableã«ãã¯ã¢ãããŸãã¯åæ§ã®ã¡ã«ããºã ã§ãã
- ä»®æ³åŒã³åºãã®æå°åïŒ C++ãC#ã®ãããªèšèªã§ã¯ãããã©ãŒãã³ã¹ãéèŠãªã«ãŒãã§ã®ä»®æ³ã¡ãœããåŒã³åºãã®æ°ãæžããããšã§ã倧ããªå©çãåŸãããããšããããŸããæã«ã¯ããã³ãã¬ãŒãïŒC++ïŒãã€ã³ã¿ãŒãã§ãŒã¹ãæã€æ§é äœïŒC#ïŒãè³¢æã«äœ¿çšããããšã§ãæåã¯ããªã¢ãŒãã£ãºã ãå¿ èŠã«æããå Žé¢ã§ãéçãã£ã¹ããããå¯èœã«ãªãããšããããŸãã
- ç¹æ®åãããå®è£ ïŒ äžè¬çãªã€ã³ã¿ãŒãã§ãŒã¹ã«å¯ŸããŠãç¹å®ã®åã®ããã«é«åºŠã«æé©åãããéããªã¢ãŒãã£ãã¯ãªå®è£ ãæäŸããããšã§ãä»®æ³ãã£ã¹ãããã®ã³ã¹ããåé¿ã§ããŸãã
- ãã¬ã€ããªããžã§ã¯ãïŒRustïŒïŒ Rustã®ãã¬ã€ããªããžã§ã¯ãïŒ
Box<dyn MyTrait>ïŒã¯ãä»®æ³é¢æ°ãšåæ§ã®åçãã£ã¹ããããæäŸããŸããããããRustã¯éçãã£ã¹ãããã奜ãŸããããŒãã³ã¹ãæœè±¡åããæšå¥šããŸããBox<dyn MyTrait>ã®ä»£ããã«ãžã§ããªãã¯ãã©ã¡ãŒã¿T: MyTraitãåãå ¥ããããšã§ãã³ã³ãã€ã©ã¯ãã°ãã°ã³ãŒããåçžåããéçãã£ã¹ããããšã€ã³ã©ã€ã³åã®ãããªåºç¯ãªæé©åãå¯èœã«ããŸãã - Goã€ã³ã¿ãŒãã§ãŒã¹ïŒ Goã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯åçã§ãããããåçŽãªå éšè¡šçŸïŒåãã€ã³ã¿ãšããŒã¿ãã€ã³ã¿ãå«ã2ã¯ãŒãã®æ§é äœïŒãæã£ãŠããŸããåçãã£ã¹ãããã䌎ããŸããããã®è»œéãªæ§è³ªãšèšèªã®ã³ã³ããžã·ã§ã³ãžã®çŠç¹ã«ãããéåžžã«ããã©ãŒãã³ã¹ãé«ãããšããããŸããããããããããã¹ã§äžèŠãªã€ã³ã¿ãŒãã§ãŒã¹å€æãé¿ããããšã¯äŸç¶ãšããŠè¯ãç¿æ £ã§ãã
å®è·µçãªæŽå¯ïŒ ã³ãŒãããããã¡ã€ãªã³ã°ããŠãããã¹ããããç¹å®ããŠãã ãããåçãã£ã¹ããããããã«ããã¯ã§ããå Žåã¯ããããã®ç¹å®ã®ã·ããªãªã«å¯ŸããŠãžã§ããªã¯ã¹ããã³ãã¬ãŒãããŸãã¯ç¹æ®åãããå®è£ ãéããŠéçãã£ã¹ããããå®çŸã§ãããã©ããã調æ»ããŠãã ããã
ãã€ã³ã¿/åç §ã®æé©åãšã¡ã¢ãªã¬ã€ã¢ãŠã
ããŒã¿ãã¡ã¢ãªã«ã©ã®ããã«é 眮ããããã€ã³ã¿/åç §ãã©ã®ããã«ç®¡çããããã¯ããã£ãã·ã¥ããã©ãŒãã³ã¹ãšå šäœçãªé床ã«å€§ããªåœ±é¿ãäžããŸããããã¯ãã·ã¹ãã ããã°ã©ãã³ã°ãããŒã¿éçŽåã®ã¢ããªã±ãŒã·ã§ã³ã§ç¹ã«é¢é£ããããŸãã
- ããŒã¿æåèšèšïŒDODïŒïŒ ãªããžã§ã¯ããããŒã¿ãšæ¯ãèããã«ãã»ã«åãããªããžã§ã¯ãæåèšèšïŒOODïŒã®ä»£ããã«ãDODã¯æé©ãªåŠçã®ããã«ããŒã¿ãæŽçããããšã«çŠç¹ãåœãŠãŸããããã¯ãé¢é£ããŒã¿ãã¡ã¢ãªäžã§é£ç¶ããŠé 眮ããïŒäŸïŒæ§é äœãžã®ãã€ã³ã¿ã®é åã§ã¯ãªããæ§é äœã®é åïŒããšãæå³ãããã£ãã·ã¥ã®ãããçãå€§å¹ ã«åäžãããŸãããã®ååã¯ã髿§èœã³ã³ãã¥ãŒãã£ã³ã°ãã²ãŒã ãšã³ãžã³ãéèã¢ããªã³ã°ã§äžççã«åºãé©çšãããŠããŸãã
- ããã£ã³ã°ãšã¢ã©ã€ã¡ã³ãïŒ CPUã¯ãããŒã¿ãç¹å®ã®ã¡ã¢ãªã¢ãã¬ã¹å¢çã«æŽåããŠãããšãããè¯ãããã©ãŒãã³ã¹ãçºæ®ããããšããããããŸããã³ã³ãã€ã©ã¯éåžžãããåŠçããŸãããç¹ã«ããŒããŠã§ã¢ããããã¯ãŒã¯ãããã³ã«ãšããåãããå Žåãæ§é äœã®ãµã€ãºãšã¬ã€ã¢ãŠããæé©åããããã«æç€ºçãªå¶åŸ¡ïŒäŸïŒC/C++ã®
__attribute__((aligned))ãRustã®#[repr(align(N))]ïŒãå¿ èŠã«ãªãããšããããŸãã - 鿥åç §ã®åæžïŒ ãã¹ãŠã®ãã€ã³ã¿ã®ããªãã¡ã¬ã³ã¹ã¯éæ¥åç §ã§ãããã¿ãŒã²ããã¡ã¢ãªããã£ãã·ã¥ã«ãªãå Žåã¯ãã£ãã·ã¥ãã¹ãçºçãããå¯èœæ§ããããŸããç¹ã«ã¿ã€ããªã«ãŒãã§ãããŒã¿ãçŽæ¥æ ŒçŽããããã³ã³ãã¯ããªããŒã¿æ§é ã䜿çšãããããŠéæ¥åç §ãæå°éã«æããããšã§ãå€§å¹ ãªé床åäžãåŸãããŸãã
- é£ç¶ã¡ã¢ãªå²ãåœãŠïŒ é »ç¹ãªèŠçŽ ã¢ã¯ã»ã¹ãšãã£ãã·ã¥å±ææ§ãéèŠãªå Žåã¯ãC++ã§ã¯
std::listãããstd::vectorãJavaã§ã¯LinkedListãããArrayListãåªå ããŠãã ããããããã®æ§é ã¯èŠçŽ ãé£ç¶ããŠæ ŒçŽããããããã£ãã·ã¥ããã©ãŒãã³ã¹ãåäžããŸãã
ã°ããŒãã«ãªäŸïŒ ç©çãšã³ãžã³ã§ã¯ããã¹ãŠã®ç²åã®äœçœ®ã1ã€ã®é
åã«ãé床ãå¥ã®é
åã«ãå é床ã3çªç®ã®é
åã«æ ŒçŽããïŒãæ§é äœã®é
åããŸãã¯SoAïŒæ¹ããParticleãªããžã§ã¯ãã®é
åïŒãæ§é äœã®é
åããŸãã¯AoSïŒãããããã©ãŒãã³ã¹ãè¯ãããšããããããŸãããªããªããCPUã¯åçš®ã®ããŒã¿ãããå¹ççã«åŠçããç¹å®ã®ã³ã³ããŒãã³ããå埩åŠçããéã®ãã£ãã·ã¥ãã¹ãæžããããã§ãã
ã³ã³ãã€ã©ãšã©ã³ã¿ã€ã ã«ããæé©åæ¯æŽ
æç€ºçãªã³ãŒã倿Žä»¥å€ã«ããçŸä»£ã®ã³ã³ãã€ã©ãšã©ã³ã¿ã€ã ã¯ãåã®äœ¿çšãèªåçã«æé©åããããã®æŽç·Žãããã¡ã«ããºã ãæäŸããŸãã
Just-In-TimeïŒJITïŒã³ã³ãã€ã«ãšåãã£ãŒãããã¯
JITã³ã³ãã€ã©ïŒJavaãC#ãJavaScript V8ãPyPyã䜿çšããPythonãªã©ã§äœ¿çšïŒã¯åŒ·åãªããã©ãŒãã³ã¹ãšã³ãžã³ã§ãããã€ãã³ãŒããäžé衚çŸãå®è¡æã«ãã€ãã£ããã·ã³ã³ãŒãã«ã³ã³ãã€ã«ããŸããéèŠãªããšã«ãJITã¯ããã°ã©ã å®è¡äžã«åéããããåãã£ãŒãããã¯ããæŽ»çšã§ããŸãã
- åçè±æé©åãšåæé©åïŒ JITã¯ãããªã¢ãŒãã£ãã¯ãªåŒã³åºãç®æã§ééããåã«ã€ããŠãæåã¯æ¥œèгçãªä»®å®ãç«ãŠããããããŸããïŒäŸïŒåžžã«ç¹å®ã®å ·è±¡åãæž¡ããããšä»®å®ããïŒããã®ä»®å®ãé·æéæå¹ã§ããã°ãé«åºŠã«æé©åãããç¹æ®ãªã³ãŒããçæã§ããŸããåŸã§ãã®ä»®å®ãåœã§ããããšã倿ããå ŽåãJITã¯æé©åãããŠããªããã¹ã«ãè±æé©åãããæ°ããåæ å ±ã§ãåæé©åãããããšãã§ããŸãã
- ã€ã³ã©ã€ã³ãã£ãã·ã³ã°ïŒ JITã¯ãã¡ãœããåŒã³åºãã®ã¬ã·ãŒããŒã®åãèšæ¶ããããã«ã€ã³ã©ã€ã³ãã£ãã·ã¥ã䜿çšããåãåãžã®åŸç¶ã®åŒã³åºããé«éåããŸãã
- ãšã¹ã±ãŒãè§£æïŒ JavaãC#ã§äžè¬çãªãã®æé©åã¯ããªããžã§ã¯ãããã®ããŒã«ã«ã¹ã³ãŒãããããšã¹ã±ãŒãããããã©ããïŒã€ãŸããä»ã®ã¹ã¬ããããèŠããããã«ãªã£ããããã£ãŒã«ãã«æ ŒçŽãããããããã©ããïŒã倿ããŸãããªããžã§ã¯ãããšã¹ã±ãŒãããªãå ŽåãããŒãã§ã¯ãªãã¹ã¿ãã¯ã«å²ãåœãŠãããå¯èœæ§ããããGCã®å§åã軜æžãã屿æ§ãåäžãããŸãããã®è§£æã¯ãã³ã³ãã€ã©ã®ãªããžã§ã¯ãåãšãã®ã©ã€ããµã€ã¯ã«ã«é¢ããçè§£ã«å€§ããäŸåããŠããŸãã
å®è·µçãªæŽå¯ïŒ JITã¯è³¢ãã§ãããããæç¢ºãªåã·ã°ãã«ãæäŸããã³ãŒããæžãããšïŒäŸïŒC#ã§ã®é床ãªobjectã®äœ¿çšãJava/Kotlinã§ã®Anyã®äœ¿çšãé¿ããïŒã¯ãJITãããæé©åãããã³ãŒããããè¿
éã«çæããã®ãå©ããããšãã§ããŸãã
åç¹æ®åã®ããã®Ahead-Of-TimeïŒAOTïŒã³ã³ãã€ã«
AOTã³ã³ãã€ã«ã¯ãå®è¡åã«ãå€ãã®å Žåéçºæã«ã³ãŒãããã€ãã£ããã·ã³ã³ãŒãã«ã³ã³ãã€ã«ããããšãå«ã¿ãŸããJITãšã¯ç°ãªããAOTã³ã³ãã€ã©ã¯å®è¡æã®åãã£ãŒãããã¯ãæã¡ãŸããããå®è¡æã®å¶çŽã®ããã«JITãå®è¡ã§ããªãåºç¯ã§æéã®ãããæé©åãå®è¡ã§ããŸãã
- ç©æ¥µçãªã€ã³ã©ã€ã³åãšåçžåïŒ AOTã³ã³ãã€ã©ã¯ãã¢ããªã±ãŒã·ã§ã³å šäœã§é¢æ°ãå®å šã«ã€ã³ã©ã€ã³åãããžã§ããªãã¯ã³ãŒããåçžåããããšãã§ããããå°ãããããé«éãªãã€ããªã«ã€ãªãããŸããããã¯C++ãRustãGoã®ã³ã³ãã€ã«ã®ç¹åŸŽã§ãã
- ãªã³ã¯ææé©åïŒLTOïŒïŒ LTOã«ãããã³ã³ãã€ã©ã¯ã³ã³ãã€ã«åäœãè¶ããŠæé©åã§ããããã°ã©ã ã®ã°ããŒãã«ãªãã¥ãŒãæäŸããŸããããã«ãããããç©æ¥µçãªãããã³ãŒãé€å»ã颿°ã€ã³ã©ã€ã³åãããŒã¿ã¬ã€ã¢ãŠãæé©åãå¯èœã«ãªãããããã¯ãã¹ãŠãã³ãŒãããŒã¹å šäœã§åãã©ã®ããã«äœ¿çšããããã«åœ±é¿ãããŸãã
- èµ·åæéã®ççž®ïŒ ã¯ã©ãŠããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ããµãŒããŒã¬ã¹é¢æ°ã«ãšã£ãŠãAOTã³ã³ãã€ã«ãããèšèªã¯ãJITã®ãŠã©ãŒã ã¢ãããã§ãŒãºããªããããããé«éãªèµ·åæéãæäŸããããšããããããŸããããã«ãããããŒã¹ãçãªã¯ãŒã¯ããŒãã«å¯Ÿããéçšã³ã¹ããåæžã§ããŸãã
ã°ããŒãã«ãªæèïŒ èµ·åæéããã€ããªãµã€ãºãéèŠãªçµã¿èŸŒã¿ã·ã¹ãã ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ïŒiOSãAndroidãã€ãã£ãïŒãã¯ã©ãŠã颿°ã§ã¯ãAOTã³ã³ãã€ã«ïŒäŸïŒC++ãRustãGoããŸãã¯Javaçšã®GraalVMãã€ãã£ãã€ã¡ãŒãžïŒã¯ãã³ã³ãã€ã«æã«æ¢ç¥ã®å ·è±¡åã®äœ¿çšã«åºã¥ããŠã³ãŒããç¹æ®åããããšã«ããããã°ãã°ããã©ãŒãã³ã¹äžã®å©ç¹ãæäŸããŸãã
ãããã¡ã€ã«ã¬ã€ãä»ãæé©åïŒPGOïŒ
PGOã¯AOTãšJITã®éã®ã®ã£ãããåããŸããã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ãã代衚çãªã¯ãŒã¯ããŒãã§å®è¡ããŠãããã¡ã€ãªã³ã°ããŒã¿ïŒäŸïŒããããªã³ãŒããã¹ãé »ç¹ã«åãããåå²ãå®éã®åã®äœ¿çšé »åºŠïŒãåéãããã®ãããã¡ã€ã«ããŒã¿ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãåã³ã³ãã€ã«ããéåžžã«æ å ±ã«åºã¥ããæé©å決å®ãè¡ããŸãã
- å®äžçã®åäœ¿çšæ³ïŒ PGOã¯ãããªã¢ãŒãã£ãã¯ãªåŒã³åºãç®æã§ã©ã®åãæãé »ç¹ã«äœ¿çšããããã«ã€ããŠã®æŽå¯ãã³ã³ãã€ã©ã«äžãããããã®äžè¬çãªåã«å¯ŸããŠæé©åãããã³ãŒããã¹ãçæãããŸããªåã«å¯ŸããŠã¯æé©åã®å°ãªããã¹ãçæããããšãå¯èœã«ããŸãã
- åå²äºæž¬ãšããŒã¿ã¬ã€ã¢ãŠãã®æ¹åïŒ ãããã¡ã€ã«ããŒã¿ã¯ããã£ãã·ã¥ãã¹ãšåå²äºæž¬ãã¹ãæå°éã«æããããã«ã³ãŒããšããŒã¿ãé 眮ããéã«ã³ã³ãã€ã©ãã¬ã€ãããããã©ãŒãã³ã¹ã«çŽæ¥åœ±é¿ããŸãã
å®è·µçãªæŽå¯ïŒ PGOã¯ãC++ãRustãGoã®ãããªèšèªã§ã®æ¬çªãã«ãã«å¯ŸããŠãç¹ã«è€éãªã©ã³ã¿ã€ã åäœã倿§ãªåçžäºäœçšãæã€ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠãå€§å¹ ãªããã©ãŒãã³ã¹åäžïŒãã°ãã°5ã15%ïŒãããããå¯èœæ§ããããŸããããã¯ãèŠéããããã¡ãªé«åºŠãªæé©åæè¡ã§ãã
èšèªå¥ã®è©³çްãšãã¹ããã©ã¯ãã£ã¹
é«åºŠãªåæé©åæè¡ã®é©çšã¯ãããã°ã©ãã³ã°èšèªã«ãã£ãŠå€§ããç°ãªããŸããããã§ã¯ãèšèªåºæã®æŠç¥ã«ã€ããŠæãäžããŸãã
C++: constexpr, Templates, Move Semantics, Small Object Optimization
constexpr: å ¥åãæ¢ç¥ã®å Žåãã³ã³ãã€ã«æã«èšç®ãå®è¡ã§ããŸããããã«ãããè€éãªåé¢é£ã®èšç®ã宿°ããŒã¿çæã®ã©ã³ã¿ã€ã ãªãŒããŒããããå€§å¹ ã«åæžã§ããŸãã- ãã³ãã¬ãŒããšã¡ã¿ããã°ã©ãã³ã°ïŒ C++ã®ãã³ãã¬ãŒãã¯ãéçããªã¢ãŒãã£ãºã ïŒåçžåïŒãšã³ã³ãã€ã«æèšç®ã«éåžžã«åŒ·åã§ãããã³ãã¬ãŒãã¡ã¿ããã°ã©ãã³ã°ã掻çšããããšã§ãè€éãªåäŸåã®ããžãã¯ãã©ã³ã¿ã€ã ããã³ã³ãã€ã«æã«ç§»è¡ã§ããŸãã
- ã ãŒãã»ãã³ãã£ã¯ã¹ (C++11+):
rvalueåç §ãšã ãŒãã³ã³ã¹ãã©ã¯ã¿/ä»£å ¥æŒç®åãå°å ¥ããŸããè€éãªåã®å ŽåããªãœãŒã¹ïŒäŸïŒã¡ã¢ãªããã¡ã€ã«ãã³ãã«ïŒããã£ãŒãã³ããŒãã代ããã«ãã ãŒããããããšã§ãäžèŠãªå²ãåœãŠãšè§£æŸãåé¿ããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã - ã¹ã¢ãŒã«ãªããžã§ã¯ãæé©å (SOO): å°ããªåïŒäŸïŒ
std::stringãstd::vectorïŒã®å Žåãäžéšã®æšæºã©ã€ãã©ãªå®è£ ã¯SOOãæ¡çšããŠãããå°éã®ããŒã¿ã¯ãªããžã§ã¯ãèªäœã®äžã«çŽæ¥æ ŒçŽãããäžè¬çãªå°ããªã±ãŒã¹ã§ã®ããŒãå²ãåœãŠãåé¿ããŸããéçºè ã¯ãã«ã¹ã¿ã åã«å¯ŸããŠãåæ§ã®æé©åãå®è£ ã§ããŸãã - é 眮new: äºåã«å²ãåœãŠãããã¡ã¢ãªã«ãªããžã§ã¯ããæ§ç¯ã§ããé«åºŠãªã¡ã¢ãªç®¡çæè¡ã§ãã¡ã¢ãªããŒã«ã髿§èœã·ããªãªã§åœ¹ç«ã¡ãŸãã
Java/C#: ããªããã£ãå, æ§é äœ (C#), Final/Sealed, ãšã¹ã±ãŒãè§£æ
- ããªããã£ãåãåªå
ããïŒ ããã©ãŒãã³ã¹ãéèŠãªã»ã¯ã·ã§ã³ã§ã¯ãã©ãããŒã¯ã©ã¹ïŒ
IntegerãFloatãDoubleãBooleanïŒã®ä»£ããã«åžžã«ããªããã£ãåïŒintãfloatãdoubleãboolïŒã䜿çšãããã¯ã·ã³ã°/ã¢ã³ãã¯ã·ã³ã°ã®ãªãŒããŒããããšããŒãå²ãåœãŠãåé¿ããŸãã - C#ã®
structïŒ å°ããªå€ã®ãããªããŒã¿åïŒäŸïŒç¹ãè²ãå°ããªãã¯ãã«ïŒã«ã¯structãæ¡çšããã¹ã¿ãã¯å²ãåœãŠãšãã£ãã·ã¥å±ææ§ã®åäžãšããå©ç¹ã掻çšããŸããç¹ã«ã¡ãœããåŒæ°ãšããŠæž¡ãå Žåã倿ž¡ãã»ãã³ãã£ã¯ã¹ã«æ³šæããŠãã ããã倧ããªæ§é äœãæž¡ãéã®ããã©ãŒãã³ã¹åäžã®ããã«ã¯refãŸãã¯inããŒã¯ãŒãã䜿çšããŸãã final(Java) /sealed(C#): ã¯ã©ã¹ãfinalãŸãã¯sealedãšããŒã¯ããããšã§ãJITã³ã³ãã€ã©ã¯ãã¡ãœããããªãŒããŒã©ã€ããããªãããšãç¥ã£ãŠãããããã¡ãœããåŒã³åºãã®ã€ã³ã©ã€ã³åãªã©ãããç©æ¥µçãªæé©å決å®ãè¡ãããšãã§ããŸãã- ãšã¹ã±ãŒãè§£æ (JVM/CLR): JVMãšCLRã«ãã£ãŠå®è¡ãããæŽç·Žããããšã¹ã±ãŒãè§£æã«äŸåããŸããéçºè ãæç€ºçã«å¶åŸ¡ãããã®ã§ã¯ãããŸãããããã®ååãçè§£ããããšã§ããªããžã§ã¯ãã®ã¹ã³ãŒããéå®ããã³ãŒããæžãããšãæšå¥šãããã¹ã¿ãã¯å²ãåœãŠãå¯èœã«ãªããŸãã
record struct(C# 9+): å€åã®å©ç¹ãšã¬ã³ãŒãã®ç°¡æœããçµã¿åãããåªããããã©ãŒãã³ã¹ç¹æ§ãæã€äžå€ã®å€åãå®çŸ©ããããããŸãã
Rust: ãŒãã³ã¹ãæœè±¡å, æææš©, åçš, Box, Arc, Rc
- ãŒãã³ã¹ãæœè±¡åïŒ Rustã®äžæ žçãªå²åŠãã€ãã¬ãŒã¿ã
Result/Optionåã®ãããªæœè±¡åã¯ãææžãã®Cã³ãŒããšåçããã以äžã«é«éãªã³ãŒãã«ã³ã³ãã€ã«ãããæœè±¡åèªäœã®ããã®ã©ã³ã¿ã€ã ãªãŒããŒãããã¯ãããŸãããããã¯ããã®å ç¢ãªåã·ã¹ãã ãšã³ã³ãã€ã©ã«å€§ããäŸåããŠããŸãã - æææš©ãšåçšïŒ ã³ã³ãã€ã«æã«åŒ·å¶ãããæææš©ã·ã¹ãã ã¯ãããŒã¿ç«¶åãuse-after-freeãšãã£ãã©ã³ã¿ã€ã ãšã©ãŒã®ã¯ã©ã¹å šäœãæé€ããã¬ããŒãžã³ã¬ã¯ã¿ãªãã§éåžžã«å¹ççãªã¡ã¢ãªç®¡çãå¯èœã«ããŸãããã®ã³ã³ãã€ã«æã®ä¿èšŒã«ãããæããããšã®ãªã䞊è¡åŠçãšäºæž¬å¯èœãªããã©ãŒãã³ã¹ãå¯èœã«ãªããŸãã
- ã¹ããŒããã€ã³ã¿ (
Box,Arc,Rc):Box<T>: åäžã®ææè ãæã€ãããŒãå²ãåœãŠãããã¹ããŒããã€ã³ã¿ãååž°çãªããŒã¿æ§é ãéåžžã«å€§ããªããŒã«ã«å€æ°ãªã©ãåäžã®ææè ã®ããã«ããŒãå²ãåœãŠãå¿ èŠãªå Žåã«äœ¿çšããŸããRc<T>(åç §ã«ãŠã³ã): ã·ã³ã°ã«ã¹ã¬ããã³ã³ããã¹ãã§ã®è€æ°ææè ã®ããã«ãæææš©ãå ±æããæåŸã®ææè ãç Žæ£ããããšã¯ãªãŒã³ã¢ãããããŸããArc<T>(ã¢ãããã¯åç §ã«ãŠã³ã): ãã«ãã¹ã¬ããã³ã³ããã¹ãçšã®ã¹ã¬ããã»ãŒããªRcã§ãããã¢ãããã¯æäœã䌎ããRcãšæ¯èŒããŠããããªããã©ãŒãã³ã¹ãªãŒããŒããããçºçããŸãã
#[inline]/#[no_mangle]/#[repr(C)]: ç¹å®ã®æé©åæŠç¥ïŒã€ã³ã©ã€ã³åãå€éšABIäºææ§ãã¡ã¢ãªã¬ã€ã¢ãŠãïŒã®ããã«ã³ã³ãã€ã©ãã¬ã€ããã屿§ã
Python/JavaScript: åãã³ã, JITã®èæ ®äºé , æ éãªããŒã¿æ§é ã®éžæ
åçåä»ãã§ããããããã®èšèªã¯æ éãªåã®èæ ®ãã倧ããªæ©æµãåããŸãã
- åãã³ã (Python): ãªãã·ã§ã³ã§ãããäž»ã«éçè§£æãšéçºè ã®æç¢ºæ§ã®ããã®ãã®ã§ãããåãã³ãã¯é«åºŠãªJITïŒPyPyãªã©ïŒãããè¯ãæé©å決å®ãè¡ãã®ãå©ããããšããããŸããããã«éèŠãªããšã«ãã°ããŒãã«ããŒã ã«ãšã£ãŠã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžãããŸãã
- JITãžã®æèïŒ PythonïŒäŸïŒCPythonïŒã¯ã€ã³ã¿ããªã¿åã§ããã®ã«å¯ŸããJavaScriptã¯ãã°ãã°é«åºŠã«æé©åãããJITãšã³ãžã³ïŒV8ãSpiderMonkeyïŒã§å®è¡ãããããšãçè§£ããŠãã ãããJavaScriptã§ã¯ã倿°ã®åãé »ç¹ã«å€æŽããããããããªã³ãŒãã§ãªããžã§ã¯ãã«åçã«ããããã£ã远å /åé€ããããããªã©ãJITãæ··ä¹±ããããè±æé©åããã¿ãŒã³ãé¿ããŠãã ããã
- ããŒã¿æ§é ã®éžæïŒ äž¡æ¹ã®èšèªã§ãçµã¿èŸŒã¿ããŒã¿æ§é ã®éžæïŒPythonã®
listvs.tuplevs.setvs.dictãJavaScriptã®Arrayvs.Objectvs.Mapvs.SetïŒã¯éåžžã«éèŠã§ãããããã®åºç€ãšãªãå®è£ ãšããã©ãŒãã³ã¹ç¹æ§ïŒäŸïŒããã·ã¥ããŒãã«ã®ã«ãã¯ã¢ãã vs. é åã®ã€ã³ããã¯ã¹ã¢ã¯ã»ã¹ïŒãçè§£ããŠãã ããã - ãã€ãã£ãã¢ãžã¥ãŒã«/WebAssemblyïŒ çã«ããã©ãŒãã³ã¹ãéèŠãªã»ã¯ã·ã§ã³ã«ã€ããŠã¯ãèšç®ããã€ãã£ãã¢ãžã¥ãŒã«ïŒPython Cæ¡åŒµãNode.js N-APIïŒãWebAssemblyïŒãã©ãŠã¶ããŒã¹ã®JavaScriptçšïŒã«ãªãããŒãããŠãéçåä»ããAOTã³ã³ãã€ã«ãããèšèªã掻çšããããšãæ€èšããŠãã ããã
Go: ã€ã³ã¿ãŒãã§ãŒã¹ã®æºè¶³, æ§é äœã®åã蟌ã¿, äžèŠãªå²ãåœãŠã®åé¿
- æç€ºçãªã€ã³ã¿ãŒãã§ãŒã¹æºè¶³ïŒ Goã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯æé»çã«æºãããããã匷åã§ããããããã€ã³ã¿ãŒãã§ãŒã¹ãå³å¯ã«å¿ èŠã§ãªãå Žåã«å ·è±¡åãçŽæ¥æž¡ãããšã§ãã€ã³ã¿ãŒãã§ãŒã¹å€æãšåçãã£ã¹ãããã®ããããªãªãŒããŒããããåé¿ã§ããŸãã
- æ§é äœã®åã蟌ã¿ïŒ Goã¯ç¶æ¿ãããã³ã³ããžã·ã§ã³ãæšå¥šããŸããæ§é äœã®åã蟌ã¿ïŒå¥ã®æ§é äœå ã«æ§é äœãåã蟌ãïŒã¯ãä»®æ³ã¡ãœããåŒã³åºãã®ã³ã¹ããåé¿ããæ·±ãç¶æ¿éå±€ãããããã©ãŒãã³ã¹ãé«ãããšãå€ããhas-aãé¢ä¿ãå¯èœã«ããŸãã
- ããŒãå²ãåœãŠã®æå°åïŒ Goã®ã¬ããŒãžã³ã¬ã¯ã¿ã¯é«åºŠã«æé©åãããŠããŸãããäžèŠãªããŒãå²ãåœãŠã¯äŸç¶ãšããŠãªãŒããŒãããã䌎ããŸããé©åãªå Žæã§å€åïŒæ§é äœïŒãåªå
ãããããã¡ãåå©çšããã«ãŒãå
ã§ã®æååé£çµã«æ³šæããŠãã ããã
makeãšnew颿°ã«ã¯æç¢ºãªçšéããããŸããããããããã€é©åããçè§£ããŠãã ããã - ãã€ã³ã¿ã»ãã³ãã£ã¯ã¹ïŒ Goã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããŸãããæ§é äœã«å¯ŸããŠãã€ã³ã¿ã䜿çšãããå€ã³ããŒã䜿çšããããçè§£ããããšã¯ãç¹ã«åŒæ°ãšããŠæž¡ããã倧ããªæ§é äœã®å Žåãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
åé§åããã©ãŒãã³ã¹ã®ããã®ããŒã«ã𿹿³è«
广çãªåæé©åã¯ãåã«æè¡ãç¥ã£ãŠããã ãã§ã¯ãªããããããäœç³»çã«é©çšãããã®åœ±é¿ã枬å®ããããšã§ãã
ãããã¡ã€ãªã³ã°ããŒã«ïŒCPUãã¡ã¢ãªãå²ãåœãŠãããã¡ã€ã©ïŒ
枬å®ããªããã®ãæé©åããããšã¯ã§ããŸããããããã¡ã€ã©ã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«äžå¯æ¬ ã§ãã
- CPUãããã¡ã€ã©ïŒ ïŒäŸïŒLinuxã®
perfãVisual Studio ProfilerãJava Flight RecorderãGo pprofãJavaScriptçšã®Chrome DevToolsïŒã¯ãããããã¹ããããâæãCPUæéãæ¶è²»ããŠãã颿°ãã³ãŒãã»ã¯ã·ã§ã³âãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãããããã¯ãããªã¢ãŒãã£ãã¯ãªåŒã³åºããé »ç¹ã«çºçããŠããå Žæããã¯ã·ã³ã°/ã¢ã³ãã¯ã·ã³ã°ã®ãªãŒããŒããããé«ãå ŽæããŸãã¯äžé©åãªããŒã¿ã¬ã€ã¢ãŠãã«ãããã£ãã·ã¥ãã¹ãå€çºããŠããå Žæãæããã«ããããšãã§ããŸãã - ã¡ã¢ãªãããã¡ã€ã©ïŒ ïŒäŸïŒValgrind MassifãJava VisualVMã.NETçšã®dotMemoryãChrome DevToolsã®ããŒãã¹ãããã·ã§ããïŒã¯ãéå°ãªããŒãå²ãåœãŠãã¡ã¢ãªãªãŒã¯ãç¹å®ãããªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ãçè§£ããããã«äžå¯æ¬ ã§ããããã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãžã®å§åãšãå€å察åç §åã®åœ±é¿ã«çŽæ¥é¢é£ããŠããŸãã
- å²ãåœãŠãããã¡ã€ã©ïŒ å²ãåœãŠãµã€ãã«çŠç¹ãåœãŠãç¹æ®ãªã¡ã¢ãªãããã¡ã€ã©ã¯ããªããžã§ã¯ããããŒãäžã§ã©ãã§å²ãåœãŠãããŠããããæ£ç¢ºã«ç€ºããå€åããªããžã§ã¯ãããŒãªã³ã°ãéããŠå²ãåœãŠãåæžããåãçµã¿ãå°ããŸãã
ã°ããŒãã«ãªå©çšå¯èœæ§ïŒ ãããã®ããŒã«ã®å€ãã¯ãªãŒãã³ãœãŒã¹ã§ããããåºã䜿çšãããŠããIDEã«çµã¿èŸŒãŸããŠãããå°ççãªå Žæãäºç®ã«é¢ä¿ãªãéçºè ãã¢ã¯ã»ã¹ã§ããŸãããã®åºåãè§£éããæ¹æ³ãåŠã¶ããšã¯éèŠãªã¹ãã«ã§ãã
ãã³ãããŒãã³ã°ãã¬ãŒã ã¯ãŒã¯
æœåšçãªæé©åãç¹å®ããããããã®åœ±é¿ã確å®ã«å®éåããããã«ãã³ãããŒã¯ãå¿ èŠã§ãã
- ãã€ã¯ããã³ãããŒãã³ã°ïŒ ïŒäŸïŒJavaçšã®JMHãC++çšã®Google BenchmarkãC#çšã®Benchmark.NETãGoã®
testingããã±ãŒãžïŒã¯ãå°ããªã³ãŒãåäœãåé¢ããŠæ£ç¢ºã«æž¬å®ã§ããŸããããã¯ãç°ãªãåé¢é£ã®å®è£ ïŒäŸïŒstruct vs. classãç°ãªããžã§ããªãã¯ã¢ãããŒãïŒã®ããã©ãŒãã³ã¹ãæ¯èŒããã®ã«éåžžã«äŸ¡å€ããããŸãã - ãã¯ããã³ãããŒãã³ã°ïŒ ãã倧ããªã·ã¹ãã ã³ã³ããŒãã³ããŸãã¯ã¢ããªã±ãŒã·ã§ã³å šäœã®ãšã³ãããŒãšã³ãã®ããã©ãŒãã³ã¹ãçŸå®çãªè² è·ã®äžã§æž¬å®ããŸãã
å®è·µçãªæŽå¯ïŒ æé©åãé©çšããååŸã«å¿ ããã³ãããŒã¯ãè¡ã£ãŠãã ãããã·ã¹ãã å šäœãžã®åœ±é¿ãæç¢ºã«çè§£ããã«ãã€ã¯ãæé©åãè¡ãããšã«ã¯æ³šæããŠãã ãããã°ããŒãã«ã«åæ£ããããŒã ã®ããã«åçŸå¯èœãªçµæãçæããããã«ããã³ãããŒã¯ãå®å®ããéé¢ãããç°å¢ã§å®è¡ãããããšã確èªããŠãã ããã
éçè§£æãšãªã³ã¿ãŒ
éçè§£æããŒã«ïŒäŸïŒClang-TidyãSonarQubeãESLintãPylintãGoVetïŒã¯ãã©ã³ã¿ã€ã åã§ãã£ãŠããåã®äœ¿çšã«é¢é£ããæœåšçãªããã©ãŒãã³ã¹ã®èœãšã穎ãç¹å®ã§ããŸãã
- éå¹çãªã³ã¬ã¯ã·ã§ã³ã®äœ¿çšãäžèŠãªãªããžã§ã¯ãå²ãåœãŠããŸãã¯JITã³ã³ãã€ã«èšèªã§ã®è±æé©åã«ã€ãªããå¯èœæ§ã®ãããã¿ãŒã³ããã©ã°ä»ãã§ããŸãã
- ãªã³ã¿ãŒã¯ãããã©ãŒãã³ã¹ã«é©ããåã®äœ¿çšãä¿é²ããã³ãŒãã£ã³ã°æšæºã匷å¶ã§ããŸãïŒäŸïŒå
·è±¡åãããã£ãŠããå Žåã«C#ã§
var objectã䜿çšããããšãæšå¥šããªãïŒã
ããã©ãŒãã³ã¹ã®ããã®ãã¹ãé§åéçºïŒTDDïŒ
éçºã¯ãŒã¯ãããŒã«æåããããã©ãŒãã³ã¹ã®èæ ®äºé ãçµ±åããããšã¯ã匷åãªå®è·µã§ããããã¯ãåã«æ£ããã®ããã®ãã¹ããæžãã ãã§ãªããããã©ãŒãã³ã¹ã®ããã®ãã¹ããæžãããšãæå³ããŸãã
- ããã©ãŒãã³ã¹ããžã§ããïŒ éèŠãªé¢æ°ãã³ã³ããŒãã³ãã®ããã©ãŒãã³ã¹ããžã§ãããå®çŸ©ããŸããèªååããããã³ãããŒã¯ã¯ãããã©ãŒãã³ã¹ã蚱容éŸå€ãè¶ ããŠäœäžããå Žåã«å€±æãããªã°ã¬ãã·ã§ã³ãã¹ããšããŠæ©èœããŸãã
- æ©æçºèŠïŒ èšè𿮵éã®æ©ãææã«åãšãã®ããã©ãŒãã³ã¹ç¹æ§ã«çŠç¹ãåœãŠãããã©ãŒãã³ã¹ãã¹ãã§æ€èšŒããããšã§ãéçºè ã¯é倧ãªããã«ããã¯ãèç©ããã®ãé²ãããšãã§ããŸãã
ã°ããŒãã«ãªåœ±é¿ãšå°æ¥ã®ãã¬ã³ã
é«åºŠãªåæé©åã¯åãªãåŠè¡çãªæŒç¿ã§ã¯ãªããå ·äœçãªã°ããŒãã«ãªåœ±é¿ãæã¡ãå°æ¥ã®ã€ãããŒã·ã§ã³ã«ãšã£ãŠäžå¯æ¬ ãªåéã§ãã
ã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ãšãšããžããã€ã¹ã«ãããããã©ãŒãã³ã¹
ã¯ã©ãŠãç°å¢ã§ã¯ãç¯çŽãããããªç§ããšãéçšã³ã¹ãã®åæžãšã¹ã±ãŒã©ããªãã£ã®åäžã«çŽæ¥ã€ãªãããŸããå¹ççãªåã®äœ¿çšã¯ãCPUãµã€ã¯ã«ãã¡ã¢ãªãããããªã³ãããããã¯ãŒã¯åž¯åå¹ ãæå°éã«æãããããã¯ã³ã¹ãå¹çã®é«ãã°ããŒãã«å±éã«ãšã£ãŠéèŠã§ãããªãœãŒã¹ã«å¶çŽã®ãããšããžããã€ã¹ïŒIoTãã¢ãã€ã«ãçµã¿èŸŒã¿ã·ã¹ãã ïŒã§ã¯ãå¹ççãªåæé©åã¯ãã°ãã°èš±å®¹å¯èœãªæ©èœæ§ã®ããã®åææ¡ä»¶ã§ãã
ã°ãªãŒã³ãœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°ãšãšãã«ã®ãŒå¹ç
ããžã¿ã«ã«ãŒãã³ãããããªã³ããå¢å€§ããã«ã€ããŠããšãã«ã®ãŒå¹çã®ããã«ãœãããŠã§ã¢ãæé©åããããšã¯äžççãªè²¬åãšãªããŸããããå°ãªãCPUãµã€ã¯ã«ãããå°ãªãã¡ã¢ãªãããå°ãªãI/Oæäœã§ããŒã¿ãåŠçãããããé«éã§å¹ççãªã³ãŒãã¯ããšãã«ã®ãŒæ¶è²»ã®åæžã«çŽæ¥è²¢ç®ããŸããé«åºŠãªåæé©åã¯ããã°ãªãŒã³ã³ãŒãã£ã³ã°ãå®è·µã®åºæ¬çãªæ§æèŠçŽ ã§ãã
æ°ããèšèªãšåã·ã¹ãã
ããã°ã©ãã³ã°èšèªã®ç¶æ³ã¯é²åãç¶ããŠããŸããæ°ããèšèªïŒäŸïŒZigãNimïŒãæ¢åã®èšèªã®é²æ©ïŒäŸïŒC++ã¢ãžã¥ãŒã«ãJava Project ValhallaãC# refãã£ãŒã«ãïŒã¯ãåé§åã®ããã©ãŒãã³ã¹ã®ããã®æ°ãããã©ãã€ã ãšããŒã«ãåžžã«å°å
¥ããŠããŸãããããã®ååã«ç²ŸéããŠããããšã¯ãæãããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšããéçºè
ã«ãšã£ãŠéèŠã«ãªããŸãã
çµè«ïŒåãå¶ããè ã¯ãããã©ãŒãã³ã¹ãå¶ã
é«åºŠãªåæé©åã¯ã髿§èœã§ãªãœãŒã¹å¹çãè¯ããã°ããŒãã«ã«ç«¶äºåã®ãããœãããŠã§ã¢ãæ§ç¯ããããšã«å°œåãããã¹ãŠã®éçºè ã«ãšã£ãŠãæŽç·ŽãããŠããªããäžå¯æ¬ ãªé åã§ããããã¯åãªãæ§æãè¶ ããç§ãã¡ã®ããã°ã©ã å ã§ã®ããŒã¿è¡šçŸãšæäœã®ãŸãã«ã»ãã³ãã£ã¯ã¹ã«æ·±ãé¢ãããŸããå€åã®æ éãªéžæãããã³ã³ãã€ã©æé©åã®åŸ®åŠãªçè§£ãèšèªåºæã®æ©èœã®æŠç¥çãªé©çšãŸã§ãåã·ã¹ãã ãšã®æ·±ãé¢ããã¯ãåã«æ©èœããã ãã§ãªããåè¶ããã³ãŒããæžãåãç§ãã¡ã«äžããŸãã
ãããã®æè¡ãåãå ¥ããããšã§ãã¢ããªã±ãŒã·ã§ã³ã¯ããéãå®è¡ãããããå°ãªããªãœãŒã¹ãæ¶è²»ããæå°ã®çµã¿èŸŒã¿ããã€ã¹ããæå€§ã®ã¯ã©ãŠãã€ã³ãã©ã¹ãã©ã¯ãã£ãŸã§ã倿§ãªããŒããŠã§ã¢ãšéçšç°å¢ã§ãã广çã«ã¹ã±ãŒãªã³ã°ã§ããŸããäžçããããŸã§ä»¥äžã«ã¬ã¹ãã³ã·ãã§æç¶å¯èœãªãœãããŠã§ã¢ãèŠæ±ããäžã§ãé«åºŠãªåæé©åããã¹ã¿ãŒããããšã¯ãã¯ãä»»æã®ã¹ãã«ã§ã¯ãªãããšã³ãžãã¢ãªã³ã°ã®åè¶æ§ã®ããã®åºæ¬çãªèŠä»¶ã§ãã仿¥ãããããã¡ã€ãªã³ã°ãå®éšããããŠåã®äœ¿çšãæŽç·Žããå§ããŸãããâããªãã®ã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒããããŠå°çãæè¬ããã§ãããã